/*
题目: 完成所有交易的初始最少钱数
给你一个下标从 0 开始的二维整数数组 transactions，其中transactions[i] = [costi, cashbacki] 。

数组描述了若干笔交易。其中每笔交易必须以 某种顺序 恰好完成一次。在任意一个时刻，你有一定数目的钱 money ，为了完成交易 i ，money >= costi 这个条件必须为真。执行交易后，你的钱数 money 变成 money - costi + cashbacki 。

请你返回 任意一种 交易顺序下，你都能完成所有交易的最少钱数 money 是多少。

https://leetcode.cn/problems/minimum-money-required-before-transactions
 */
public class MinimumMoney {
    public long minimumMoney(int[][] transactions) {
        // 贪心
        int n = transactions.length;

        long loseSum = 0;
        for (int[] cur : transactions) {
            int left = cur[0];
            int right = cur[1];

            // 记录所有损失值
            if (left > right) {
                loseSum += left - right;
            }
        }

        long src = 0;
        for (int i = 0; i < n; i ++) {
            int[] cur = transactions[i];
            int left = cur[0];
            int right = cur[1];

            // 枚举 满足 所有可能的 money
            if (left > right) { // 损失
                // 总损失 + 花费
                src = Math.max(src, loseSum + (long) right);
            } else {
                // 处理完所有损失后, 加上 开销 最大的 正收益 项目
                src = Math.max(src, loseSum + (long) left);
            }
        }
        return src;
    }
}
